/**
 * 
 */
package com.ms.service.module.baccarat;

import java.math.BigDecimal;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Queue;
import java.util.concurrent.ConcurrentHashMap;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.ms.game.common.utility.SimpleTimer;
import com.ms.player.Player;
import com.ms.service.error.ErrorCode;
import com.ms.service.module.baccarat.bin.BacrRobotBetTarget;
import com.ms.service.module.baccarat.bin.BacrTableSettingInfo;
import com.ms.service.module.baccarat.db.BacrActivityCombosInfoModel;
import com.ms.service.module.baccarat.db.BacrActivityCombosLogModel;
import com.ms.service.module.baccarat.db.BacrGameLogModel;
import com.ms.service.module.baccarat.db.BacrMachineDataModel;
import com.ms.service.module.baccarat.db.BacrPlayerLogModel;
import com.ms.service.module.baccarat.message.CBacrPlayerBetRequest;
import com.ms.service.module.baccarat.message.SBacrActivityCombosData;
import com.xpec.c4.game.datamanager.agent.money.CoinType;
import com.xpec.c4.game.time.TimeConstants;
import com.xpec.c4.game.utility.GUID;
import com.xpec.c4.service.module.ModuleState;

/**
 * 百家樂遊戲核心
 * <p>
 * 一個核心代表一桌
 * 
 * @author TW15010
 */
public class BacrGameCore {
	/** log4j object */
	private static final Log log = LogFactory.getLog(BacrGameCore.class);

	public static final long AUTO_START_WAIT_TIME = 30 * TimeConstants.MILLI_SECOND_PRE_SECOND;

	/**
	 * 每副牌的張數
	 */
	public static final int CARD_COUNT_PER_DECK = 52;

	/**
	 * 第1張牌在陣列中的 index
	 */
	public static final int FIRST_CARD_INDEX = 0;

	/**
	 * 第2張牌在陣列中的 index
	 */
	public static final int SECOND_CARD_INDEX = 1;

	/**
	 * 第3張牌在陣列中的 index
	 */
	public static final int THIRD_CARD_INDEX = 2;

	/**
	 * 牌桌id<br>
	 * {@link BacrTableSettingInfo#getTableId()}
	 */
	private String tableId;

	/**
	 * 局號
	 */
	private String roundNumber;

	/**
	 * 遊戲 log model
	 */
	private BacrGameLogModel gameLogModel;

	/**
	 * 累計靴數
	 */
	private int shoeCount;

	/**
	 * 目前是第幾鋪牌
	 */
	private int handCount;

	/**
	 * 接下來要切換的遊戲狀態 {@link BacrGameStatus}
	 */
	private BacrGameStatus nextStatus = null;

	/**
	 * 目前遊戲狀態 {@link BacrGameStatus}
	 */
	private BacrGameStatus curStatus = null;

	/**
	 * 目前階段開始時間
	 */
	private long curStepBeginTime = 0;

	/**
	 * 固定的紅卡
	 */
	private BacrCard redCard;

	/**
	 * 固定的牌背
	 */
	private BacrCard cardBack;

	/**
	 * 牌靴
	 */
	private Deque<BacrCard> cardShoe = new ArrayDeque<BacrCard>();

	/**
	 * 玩家手上的牌
	 */
	private ArrayList<BacrCard> playerCards = new ArrayList<BacrCard>();

	/**
	 * 閒家是否為例牌
	 */
	private boolean playerNatural = false;

	/**
	 * 莊家手上的牌
	 */
	private ArrayList<BacrCard> bankerCards = new ArrayList<BacrCard>();

	/**
	 * 莊家是否為例牌
	 */
	private boolean bankerNatural = false;

	/**
	 * 棄牌罐 (做爽的，其實一點用也沒有)
	 */
	private ArrayList<BacrCard> discardCan = new ArrayList<BacrCard>();

	/**
	 * 是否為最後一舖牌
	 */
	private boolean lastHand = false;

	/**
	 * 在哪一個階段抽到紅卡
	 */
	private BacrGameStatus takeRedCardStep = null;

	/**
	 * 是否需要進入博牌階段
	 */
	boolean isNeedHitsStep = false;

	/**
	 * 控制流程用的計時器
	 */
	private SimpleTimer timer = new SimpleTimer();

	/**
	 * 是否忽略流程上計時的動作
	 */
	private boolean skipTimer = false;

	/**
	 * 銷牌階段的資料
	 */
	private BacrDiscardStepData discardStep = new BacrDiscardStepData();

	/**
	 * 玩家押注階段的資料
	 */
	private BacrPlayerBetStep playerBetStep = new BacrPlayerBetStep();

	/**
	 * 發牌階段資料
	 */
	private BacrDealtStepData dealtStep = new BacrDealtStepData();

	/**
	 * 瞇牌階段資料
	 */
	private BacrOpenCardStepData openCardStep = new BacrOpenCardStepData();

	/**
	 * 博牌階段的資料
	 */
	private BacrHitsStepData hitsStep = new BacrHitsStepData();

	/**
	 * 結算階段的資料
	 */
	private BacrCalculateScoreStepData calculateScoreStep = new BacrCalculateScoreStepData();

	/**
	 * 一靴牌期間的勝負記錄, 會在結算得分後才把目前牌局結果也加進去, 給 client 顯示用, 避免提早看到勝負結果
	 */
	private ArrayList<BacrGameResult> gameRecordList = new ArrayList<BacrGameResult>();

	/**
	 * 一靴牌期間的勝負記錄, 押注階段開始就會把目前牌局結果也加進去, 讓牌桌寫 log 用
	 */
	private ArrayList<BacrGameResult> gameRecordListForLog = new ArrayList<BacrGameResult>();

	/**
	 * 一靴牌結束
	 */
	private boolean shoeFinish;

	/**
	 * 一舖牌結束
	 */
	private boolean handFinish;

	/**
	 * 統計資料
	 */
	private BacrStasticData stasticData = new BacrStasticData();

	/**
	 * 玩家資料列表
	 * <p>
	 * key: player guid<br>
	 * value: player data
	 */
	private HashMap<GUID, Player> playerMap = new HashMap<GUID, Player>();

	/**
	 * 記錄有在一舖牌中途離開過的玩家 id
	 * <p>
	 * key: 玩家 id
	 */
	private HashSet<GUID> leavePlayerMap = new HashSet<GUID>();

	/**
	 * 機台資料 model, 需要寫機台資料時直接更新到這個 model 再整個寫入 db
	 */
	private BacrMachineDataModel machineModel;

	/**
	 * 機台設定數據
	 */
	private BacrTableSettingInfo machineSetting;

	/**
	 * 遊戲 module 實體
	 */
	private BacrGameModule gameModule;

	/**
	 * 伺服器進入準備關服狀態 {@link ModuleState#WAIT_TO_CLOSE}
	 */
	private boolean serverWaitToClose;

	/**
	 * 開始遊戲前的等待時間
	 */
	private long waitStartTimeDuration;

	/**
	 * 活動連勝資訊
	 */
	private BacrActivityCombosInfoModel activityCombosInfoModel;
	
	/**
	 * 取得活動連勝資訊
	 */
	public BacrActivityCombosInfoModel getBacrActivityCombosInfoModel(){
		return activityCombosInfoModel;
	}
	
	/**
	 * GMTOOL送過來修改的MODEL會先暫時放在這<br>
	 * 每次新的一舖牌都會進來檢查一次是不是null，如果不是null就換新的
	 */
	private BacrActivityCombosInfoModel GMToolChangeActivityCombosInfo = null;
	
	/**
	 * GMTOOL是否曾經關閉過活動連勝
	 */
	private boolean isGMToolEverChangeToCloseActivityCombos = false;
	
	/**
	 * 活動連勝在本局是否有效
	 */
	private boolean isActivityCombosRuning = false;
	
	/**
	 * 設定GMTOOL送過來修正的活動連勝資訊
	 */
	public void setGMToolChangeActivityCombosInfo(BacrActivityCombosInfoModel model){
		GMToolChangeActivityCombosInfo = model;
	}
	
	public BacrActivityCombosInfoModel getGMToolChangeActivityCombosInfo(){
		return GMToolChangeActivityCombosInfo;
	}
	
	/**
	 * 玩家的COMBO資訊<br>
	 * 包含活動連勝&排行榜連勝
	 */
	private ConcurrentHashMap<String, BacrCombosData> playerComboInfos = new ConcurrentHashMap<String, BacrCombosData>();
	
	/**
	 * 待處理的排行榜連勝紀錄
	 */
	private ConcurrentHashMap<GUID, Integer> playerCombosRankUpMap = new ConcurrentHashMap<GUID, Integer>();
	
	/**
	 * 待處理的活動連勝紀錄
	 */
	private HashMap<String, ArrayList<BacrActivityCombosLogModel>> activityCombosLogs = new HashMap<String, ArrayList<BacrActivityCombosLogModel>>();
	
	/**
	 * 用來記清除過期的TIMER來了沒
	 */
	private boolean isCleanCombosTimerTick = false;
	
	/**
	 * 用來記錄時間到時被清除的活動連勝紀錄
	 */
	private ArrayList<BacrActivityCombosLogModel> timeOutActivityCombsLogs = new ArrayList<BacrActivityCombosLogModel>();
	
	/*
	 * 建構
	 */
	public BacrGameCore() {
		
	}

	/**
	 * 從機台資料初始化遊戲核心
	 * 
	 * @param model
	 */
	public void initialFromModel(BacrMachineDataModel model) {
		
	}

	/**
	 * 初始新的一靴牌需要的資料
	 */
	private void initialNewShoe() {
		
	}

	/**
	 * 初始新的一鋪牌需要的資料
	 */
	private void initialNewHand() {
		
	}

	/**
	 * 建立遊戲 log 資料 step 1
	 */
	private void createGameLogStep1() {
		
	}

	/**
	 * 建立遊戲 log 資料 step 2
	 */
	private void createGameLogStep2() {
		
	}

	/**
	 * 取得玩家的 log
	 * 
	 * @param player
	 * @return
	 */
	private BacrPlayerLogModel createPlayerLogModel(Player player) {
		return null;
	}

	/**
	 * 建立新的一靴牌
	 */
	private void createNewCardShoe() {
		
	}

	/**
	 * 從牌靴中取得下一張牌
	 * <p>
	 * 如果遇到紅卡會自動丟進棄牌罐, 並標記為最後一鋪
	 * 
	 * @return
	 */
	private BacrCard takeNextCardFromShoe(BacrGameStatus curStatus) {
		return null;
	}

	/**
	 * 將不要的牌放入棄牌罐
	 * 
	 * @param card
	 */
	private void putCardToDiscardCan(BacrCard card) {
		
	}

	/**
	 * 計算牌組的總點數
	 * 
	 * @param cardList
	 * @return
	 */
	private int calculateCardPoint(ArrayList<BacrCard> cardList) {
		return 0;
	}

	/**
	 * 計算前幾張牌的總點數
	 * 
	 * @param cardList
	 * @param cardCount
	 *            要計算的張數, 0 表示計算所有的牌
	 * @return
	 */
	private int calculateFirstNCardPoint(ArrayList<BacrCard> cardList, int cardCount) {
		return 0;
	}

	/**
	 * 判斷牌組是否為例牌
	 * 
	 * @param cardList
	 * @return
	 */
	private boolean isNatural(ArrayList<BacrCard> cardList) {
		return false;
	}

	/**
	 * 判斷牌組是否有對子
	 * 
	 * @param cardList
	 *            莊或閒的牌組
	 * @return
	 */
	private boolean isHavePair(ArrayList<BacrCard> cardList) {
		return false;
	}

	/**
	 * 判斷牌組是否有博牌
	 * 
	 * @param cardList
	 *            莊或閒的牌組
	 * @return
	 */
	private boolean isHaveHits(ArrayList<BacrCard> cardList) {
		return false;
	}

	/**
	 * 判斷牌組是否有紅卡
	 * 
	 * @param cardList
	 *            莊或閒的牌組
	 * @return
	 */
	private boolean isHaveRedCard(ArrayList<BacrCard> cardList) {
		return false;
	}

	/**
	 * 計時器開始計時
	 * 
	 * @param duration
	 *            倒數時間
	 */
	private void startTimer(long duration) {
	}

	/**
	 * 檢查計時器時間是否到期
	 */
	private boolean updateTimer() {
		return false;
	}

	/**
	 * 接換遊戲狀態
	 * 
	 * @param nextStatus
	 *            要切換的狀態 {@link BacrGameStatus}
	 */
	private void changeStatus(BacrGameStatus nextStatus) {
	}

	/**
	 * 啟動遊戲
	 * 
	 * @param waitTimeDuration
	 *            啟動前等待的時間 (ms)
	 */
	public void startGame(long waitTimeDuration) {
	}

	/**
	 * 執行事件
	 * 
	 * @param status
	 * @param step
	 */
	private void executeEvent(BacrGameStatus status, BacrExecuteStep step) {
		
	}

	public boolean isSkipTimer() {
		return skipTimer;
	}

	public void setSkipTimer(boolean skipTimer) {
		this.skipTimer = skipTimer;
	}

	/**
	 * 主要更新 function, 需要被不斷呼叫
	 * 
	 * @return 執行完如果遊戲狀態 {@link #curStatus} 改變了，會回傳 true
	 */
	public boolean update() {
		return false;
	}

	/**
	 * 等待倒數啟動遊戲初始
	 */
	private void WAIT_TO_START_initial() {

	}

	/**
	 * 等待倒數啟動遊戲更新
	 */
	private void WAIT_TO_START_update() {
		
	}

	/**
	 * 啟動遊戲 初始
	 */
	private void STARTUP_initial() {
		
	}

	/**
	 * 啟動遊戲 更新
	 */
	private void STARTUP_update() {

	}

	/**
	 * 洗牌初始
	 */
	private void SHUFFLE_CARD_initial() {
		
	}

	/**
	 * 洗牌更新
	 */
	private void SHUFFLE_CARD_update() {
		
	}

	/**
	 * 銷牌初始
	 */
	private void DISCARD_initial() {
		
	}

	/**
	 * 銷牌更新
	 */
	private void DISCARD_update() {
		
	}

	/**
	 * 押注初始
	 */
	private void PLAYER_BET_initial() {
		
	}

	/**
	 * 押注更新
	 */
	private void PLAYER_BET_update() {
		
	}

	/**
	 * 產生發牌階段相關資料的邏輯
	 */
	private void dealtProc() {
		
	}

	/**
	 * 派牌初始
	 */
	private void DEALT_initial() {
		
	}

	/**
	 * 派牌更新
	 */
	private void DEALT_update() {
		if (updateTimer()) {
			changeStatus(BacrGameStatus.OPEN_CARD);
		}
	}

	/**
	 * 產生瞇牌動作資料的邏輯
	 */
	private void openCardProc() {
		
	}

	/**
	 * 開牌初始
	 */
	private void OPEN_CARD_initial() {
		
	}

	/**
	 * 開牌更新
	 */
	private void OPEN_CARD_update() {
		
	}

	/**
	 * 產生博牌階段相關資料的邏輯
	 */
	private void hitsProc() {
		
	}

	/**
	 * 博牌初始
	 */
	private void HITS_initial() {
		
	}

	/**
	 * 博牌更新
	 */
	private void HITS_update() {
		if (updateTimer()) {
			changeStatus(BacrGameStatus.CALCULATE_SCORE);
		}
	}

	/**
	 * 產生勝負結算資料的邏輯
	 */
	private void calculateScoreProc() {
		
	}

	/**
	 * 結算初始
	 */
	private void CALCULATE_SCORE_initial() {
		
	}

	/**
	 * 結算更新
	 */
	private void CALCULATE_SCORE_update() {
		
	}

	/**
	 * 關閉遊戲初始
	 */
	private void CLOSE_initial() {
		
	}

	/**
	 * 關閉遊戲更新
	 */
	private void CLOSE_update() {
		
	}

	public int getShoeCount() {
		return shoeCount;
	}

	public boolean isShoeFinish() {
		return shoeFinish;
	}

	public int getHandCount() {
		return handCount;
	}

	public boolean isHandFinish() {
		return handFinish;
	}

	public BacrStasticData getStasticData() {
		return stasticData;
	}

	/**
	 * 將玩家資料加入列表
	 * 
	 * @param player
	 */
	public void addPlayer(Player player) {
		
	}

	/**
	 * 玩家離桌
	 * 
	 * @param playerId
	 */
	public void playerLeave(GUID playerId) {
		
	}

	/**
	 * 取得在牌桌中的玩家資料
	 * 
	 * @param playerId
	 * @return
	 */
	public Player getPlayerInTable(GUID playerId) {
		return null;
	}

	/**
	 * 傳送檯面上的初始資料給 client
	 * 
	 * @param playerId
	 * @param sessionId
	 */
	private void sendInitDataToClient(GUID playerId, GUID sessionId) {
		
	}

	/**
	 * 傳送目前階段的初始資料給 client
	 * 
	 * @param sessionId
	 *            player session id
	 * @param broadcast
	 *            是否要廣播給所有在桌內的玩家
	 */
	private void sendCurrentStepInitDataToClient(GUID sessionId, boolean broadcast) {
		
	}

	/**
	 * 設定玩家押注資訊
	 * 
	 * @param playerId
	 * @param coinType
	 * @param playerBeforeMoney
	 * @param orderId
	 * @param roundNumber
	 *            局號
	 * @param request
	 *            client 傳來的押注 request
	 * @return 錯誤碼 {@link ErrorCode}
	 */
	public int setPlayerBetInfo(Player player, CoinType coinType, BigDecimal playerBeforeMoney, GUID orderId,
			String roundNumber, CBacrPlayerBetRequest request) {
		return 0;
	}

	/**
	 * 下注後廣播押注資訊給所有的玩家（排除下注的玩家）
	 * 
	 * @param betPlayerId
	 *            下注的玩家 id
	 * @param request
	 *            client 押注要求
	 */
	public void broadcastBetInfoToOtherPlayers(GUID betPlayerId, CBacrPlayerBetRequest request) {
		
	}

	/**
	 * 檢查指定玩家是否已經押過注
	 * 
	 * @param playerId
	 * @return
	 */
	public boolean isPlayerBet(GUID playerId) {
		return false;
	}

	public BacrGameStatus getCurStatus() {
		return curStatus;
	}

	/**
	 * 取得等待給分數的 queue
	 * 
	 * @return
	 */
	public Queue<BacrPlayerGetScoreInfo> getReturnScoreProcQueue() {
		return calculateScoreStep.getReturnScoreProcQueue();
	}

	/**
	 * 指定的玩家是否有在牌桌中
	 * 
	 * @param playerId
	 * @return
	 */
	public boolean isPlayerInTable(GUID playerId) {
		return false;
	}

	/**
	 * 確認指定的玩家在同一鋪牌中是否有離開過
	 * 
	 * @param playerId
	 * @return
	 */
	public boolean isPlayerHaveLeave(GUID playerId) {
		return false;
	}

	/**
	 * 取得指定押注玩家的基本資訊
	 * 
	 * @param playerId
	 * @return
	 */
	public BacrBetPlayerInfo getBetPlayerInfo(GUID playerId) {
		return null;
	}

	/**
	 * 插入指定的卡到牌靴
	 * 
	 * @param cardList
	 *            定義卡片列表, 格式: 101,102,103,104,105,106
	 */
	public void insertCardToShoe(String cardList) {
		
	}

	/**
	 * 直接進入下一個階段
	 */
	public void gotoNextStep() {
		
	}

	/**
	 * 處理機器人押注
	 */
	public void robotBetProc() {
		
	}

	/**
	 * follow 型 ai 機器人 押注計時器觸發
	 */
	public void onRobotFollowTypeBetTimerTask(BacrRobotFollowTypeBetTimerTask task) {
		
	}

	/**
	 * 依照機器人押注目標自動產生 client 押注要求資料
	 * 
	 * @param request
	 *            client request
	 * @param minBetValue
	 *            單部位最小押注額
	 * @param target
	 *            機器人押注目標
	 */
	public static void initClientRequestByRobotBetTarget(CBacrPlayerBetRequest request, int minBetValue,
			BacrRobotBetTarget target) {
		
	}

	/**
	 * 將牌靴內容轉成 model 用的字串<br>
	 * 字串格式參考 {@link BacrMachineDataModel#getCardShoe()}
	 * 
	 * @param cardShoe
	 * @return
	 */
	private String cardShoeDataToModelString(Deque<BacrCard> cardShoe) {
		return null;
	}

	/**
	 * 將 model 的牌靴內容字串還原到牌靴中
	 * 
	 * @param modelString
	 *            {@link BacrMachineDataModel#getCardShoe()}
	 * @param cardShoe
	 */
	private void cardShoeModelStringToData(String modelString, Deque<BacrCard> cardShoe) {
		
	}

	/**
	 * 將遊戲歷史記錄轉成 model 用的字串<br>
	 * 字串格式參考 {@link BacrMachineDataModel#getGameRecordList()}
	 * 
	 * @param gameRecordList
	 * @return
	 */
	private String gameRecordListDataToModelString(ArrayList<BacrGameResult> gameRecordList) {
		return null;
	}

	/**
	 * 將遊戲歷史記錄的 model string 還原成歷史記錄
	 * 
	 * @param modelString
	 *            {@link BacrMachineDataModel#getGameRecordList()}
	 * @param gameRecordList
	 */
	public static void gameRecordListModelStringToData(String modelString, ArrayList<BacrGameResult> gameRecordList) {
		
	}

	/**
	 * 將目前狀態更新到機台資料和 game log 中
	 */
	public void updateMachineDataAndLog() {
		
	}

	/**
	 * 更新機台資料 model
	 */
	private void updateMachineModel() {
		
	}

	/**
	 * 取得牌局的結果
	 * 
	 * @return
	 */
	public BacrGameResult getCurrentGameResult() {
		return null;
	}

	public String getTableId() {
		return tableId;
	}

	public BacrGameLogModel getGameLogModel() {
		return gameLogModel;
	}

	public BacrMachineDataModel getMachineModel() {
		return machineModel;
	}

	public BacrTableSettingInfo getMachineSetting() {
		return machineSetting;
	}

	public void setGameModule(BacrGameModule gameModule) {
		this.gameModule = gameModule;
	}

	public boolean isServerWaitToClose() {
		return serverWaitToClose;
	}

	public void setServerWaitToClose(boolean serverWaitToClose) {
		this.serverWaitToClose = serverWaitToClose;
	}
	
	/**
	 * 取得CORE的玩家COMBO紀錄
	 */
	public ConcurrentHashMap<String, BacrCombosData> getPlayerComboInfos(){
		return playerComboInfos;
	}
	
	/**
	 * 處理活動連勝
	 */
	public void OnHandleActivityCombos(CBacrPlayerBetRequest betInfo, BacrPlayerGetScoreInfo scoreInfo, Player player){
		
	}
	
	/**
	 * 獲得活動連勝下次獎勵的COMBO數
	 */
	public int getActivityNextCombo(int recentCombo){
		return 0;
	}
	
	/**
	 * 取得活動連勝分數
	 */
	public long getActivityCombosScore(int combos){
		return 0;
	}

	/**
	 * 取得待處理的活動連勝得分資料 map
	 */
	public HashMap<GUID,BacrPlayerActivityCombosInfo> getActivityCombosScoreInfos(){
		return calculateScoreStep.getReturnActivityCombosScoreMap();
	}

	/**
	 * 從MAP中取得玩家活動連勝得分數
	 */
	public long getPlayerActivityCombsScore(GUID playerGUID){
		return 0;
	}
	
	/**
	 * 設定傳給CLIENT用的COMBO數
	 */
	public void setBacrActivityCombosInfoForClient(String playerGUID){
		
	}
	
	/**
	 * 取得傳給CLIENT用的活動連勝資訊
	 */
	public SBacrActivityCombosData getInitActivityCombosDataForClient(String playerGUID){
		return null;
	}
	
	/**
	 * 處理排行榜連勝<br>
	 * 這邊要等到得分都計算完才能送到排行榜更新<br>
	 * 排行有上升的會先放在playerCombosRankUpMap等流程到才處理
	 */
	public void OnHandleRankCombos(CBacrPlayerBetRequest betInfo, BacrPlayerGetScoreInfo scoreInfo, Player player){
		
	}
	
	/**
	 * 取得待處理的排行榜連勝紀錄
	 */
	public ConcurrentHashMap<GUID, Integer> getPlayerCombosRankUpMap(){
		return playerCombosRankUpMap;
	}
	
	/**
	 * 清空暫時存放的排行榜連勝紀錄
	 */
	public void clearCombosRankUpMap(){
		playerCombosRankUpMap.clear();
	}
	
	/**
	 * 增加活動連勝紀錄到暫存
	 */
	public void addActivityCombosLogToLosMap(String playerGUID, int combos, long score, String logType){
		
	}
	
	/**
	 * 取得暫存的活動連勝紀錄
	 */
	public ArrayList<BacrActivityCombosLogModel> getBacrActivityCombosLog(GUID playerGUID){
		return null;
	}
	
	/**
	 * 清空暫存的活動連勝紀錄
	 */
	public void clearActivityCombosLogsMap(){
		
	}
	
	/**
	 * 清除過期的資訊
	 */
	public void cleanCombosInfos(){
		
	}
	
	public HashSet<GUID> getLeavePlayerMap() {
		return leavePlayerMap;
	}

	/**
	 * 累加押注送到 dc 處理的次數
	 */
	public void increaseBetToDcCount() {
		playerBetStep.increaseBetToDcCount();
	}

	/**
	 * 累加成功押注的次數
	 */
	public void increaseBetSuccessCount() {
		playerBetStep.increaseBetSuccessCount();
	}

	public String getRoundNumber() {
		return roundNumber;
	}

	public boolean isCleanCombosTimerTick() {
		return isCleanCombosTimerTick;
	}

	public void setCleanCombosTimerTick(boolean isCleanCombosTimerTick) {
		this.isCleanCombosTimerTick = isCleanCombosTimerTick;
	}

	public ArrayList<BacrActivityCombosLogModel> getTimeOutActivityCombsLogs() {
		return timeOutActivityCombsLogs;
	}

	public BacrActivityCombosInfoModel getActivityCombosInfoModel() {
		return activityCombosInfoModel;
	}

	public void setActivityCombosInfoModel(
			BacrActivityCombosInfoModel activityCombosInfoModel) {
		this.activityCombosInfoModel = activityCombosInfoModel;
	}
	
	/**
	 * 判斷現在時間是否是活動開啟時間 
	 */
	public boolean isInActivityCombosDuration(){
		return false;
	}
	
	/**
	 * 把GMTOOL設定的MODEL設定進來
	 */
	public void setActivityCombosInfoFromGMTool(BacrActivityCombosInfoModel model){
		
	}
	
	/**
	 * 清掉GMTOOL給予的設定
	 */
	public void cleanActivityCombosInfoFromGMTool(){
		GMToolChangeActivityCombosInfo = null;
	}
	
	/**
	 * 廣播桌內的玩家活動連勝資訊
	 */
	public void broadcastAcitvityCombosInfoChange(){
		
	}

	public BacrPlayerBetStep getPlayerBetStep() {
		return playerBetStep;
	}

	public BacrCalculateScoreStepData getCalculateScoreStep() {
		return calculateScoreStep;
	}

	public BacrGameStatus getNextStatus() {
		return nextStatus;
	}
	
	/**
	 * 歸零全部玩家的活動連勝紀錄
	 */
	public void setInitActivityCombosInfo(){
		
	}
	
	/**
	 * 從上次關機的REDIS連勝紀錄中拿出資料同步<br>
	 * 包含 活動連勝 & 排行榜連勝
	 */
	public void loadCombosRecordFromRedis(){
		
	}

	public boolean isGMToolEverChangeToCloseActivityCombos() {
		return isGMToolEverChangeToCloseActivityCombos;
	}

	public void setGMToolEverChangeToCloseActivityCombos(
			boolean isGMToolEverChangeToCloseActivityCombos) {
		this.isGMToolEverChangeToCloseActivityCombos = isGMToolEverChangeToCloseActivityCombos;
	}
}
